package com.yochi.pictureseditor.effects;

import com.yochi.pictureseditor.effects.Effect;
import com.yochi.pictureseditor.effects.EffectEnum;
import com.yochi.pictureseditor.exceptions.NullImageException;
import com.yochi.pictureseditor.factories.EffectFactory;
import com.yochi.pictureseditor.factories.ImageFactory;
import com.yochi.pictureseditor.images.Image;
import com.yochi.pictureseditor.images.ImageImpl;

import android.util.Log;

public abstract class EffectMozaic extends Effect {

	private EffectFactory effectFactory;
	private ImageFactory imageAndroidFactory;
	
	  /////////////////
	 // CONSTRUCTOR //
	/////////////////
 
	public EffectMozaic(Image img) {
		super(img);
		effectFactory = new EffectFactory();
		imageAndroidFactory = new ImageFactory();
	}
	
	  //////////////
	 // ABSTRACT //
	//////////////

	@Override
	public abstract Image apply() throws NullImageException;
	
	
	  ////////////
	 // PUBLIC //
	////////////
	
	public Image cutSquare() {
		Image image = getImage();
		try { image = getEffectFactory().buildEffect(EffectEnum.CUTTER, image, true).apply();
		} catch (NullImageException e) { 
			Log.e("EffectMozaic", "NullImageException : ",e);
		}
		return image;
	}
	
	public Image process(Image i1, Image i2, Image i3, Image i4) {
		int profondeur = i1.getProfondeur();
		int demilargeur = i1.getLargeur();
		int demihauteur = i1.getHauteur();
		int largeur = i1.getLargeur()*2;
		int hauteur = i1.getHauteur()*2;
		
		Image image = new ImageImpl(profondeur, largeur, hauteur);
		
		char pixelValue = 0;
		for(int p=0; p<profondeur; p++) {
			for(int l=0; l<largeur; l++) {
				for(int h=0; h<hauteur; h++) {
					if(l<demilargeur && h<demihauteur) pixelValue = (char) i1.getPixel(p, l, h);
					if(l>=demilargeur && h<demihauteur) pixelValue = (char) i2.getPixel(p, l-demilargeur, h);
					if(l<demilargeur && h>=demihauteur) pixelValue = (char) i3.getPixel(p, l, h-demihauteur);
					if(l>=demilargeur && h>=demihauteur) pixelValue = (char) i4.getPixel(p, l-demilargeur, h-demihauteur);
					image.setPixel(p, l, h, pixelValue);
		}	}	}
		
		image = imageAndroidFactory.resizeImage(image, 4);
		
		return image;
	}
	
	/** retourne l'effect factory */
	public EffectFactory getEffectFactory() {
		return effectFactory;
	}
	 
}
